package body Liste_Plaques is
		
	procedure Ajouter (Liste_Pl : in out T_Liste; P : in Plaques.Plaque) is
	begin
		Ajout_Tete (Liste_Pl, P);
	end Ajouter;
	
	procedure Supprimer (Liste_Pl : in out T_Liste; P : in Plaques.Plaque) is
		function Comparer (C : Plaques.Plaque) return Boolean is
		begin
			return (Plaques.Get_Id(C) = Plaques.Get_Id(P)) and (Plaques.Get_Position(C) = Plaques.Get_Position(P));
		end Comparer;
		
		procedure Supprime_Plaque is new Supprime (Comparer);
		Plaque_Supprimee : Plaques.Plaque;
	begin
		Supprime_Plaque (Liste_Pl, Plaque_Supprimee);
    end Supprimer;
    
    

--      procedure Fusion (Pi : in Pieces_Placees.Commande_Traitee) is
--         L : T_Liste ;
--         
--         function Position_Ok (P : in Plaques.Plaque) return Boolean is 
--            Hauteur_Pi,Hauteur_P : Natural ; 
--         begin
--            Hauteur_Pi :=  Get_Hauteur(Emplacements.Get_Position(Pieces.Get_Emplacement(Pieces_Placees.Get_Piece(Pi)))) + Get_Hauteur(Pieces.Get_Dimension(Pieces_Placees.Get_Piece(Pi)));
--            Hauteur_P := Get_Hauteur (Plaques.Get_Position(P));
--            return (Hauteur_Pi = Hauteur_P) AND Plaques.Get_Id(P)=Pieces_Placees.Get_Id_Plaque(Pi);
--         end Position_Ok ;
--         
--         function Cherche_Plaque is new Cherche(Position_Ok);
--         begin
--            -- Pointeur sur la plaque a modifier
--            L:= Cherche_Plaque(Liste_Pl);
--            -- Les modifications ci-dessus ne fonctionnent pas car on n'a pas P ici.
----            Set_Hauteur(Plaques.Get_Position(P),Get_Hauteur(Emplacements.Get_Position(Pieces.Get_Emplacement(Pieces_Placees.Get_Piece(Pi)))));
----            Set_Largeur(Plaques.Get_Position(P),Get_Largeur(Emplacements.Get_Position(Pieces.Get_Emplacement(Pieces_Placees.Get_Piece(Pi)))));
----            Set_Hauteur(Plaques.Get_Taille(P),Get_Hauteur(Pieces.Get_Dimension(Pieces_Placees.Get_Piece(Pi)))+Get_Hauteur(Plaques.Get_Taille(P)));
----            Set_Largeur(Plaques.Get_Taille(P),Get_Largeur(Pieces.Get_Dimension(Pieces_Placees.Get_Piece(Pi))));   
--         end Fusion;

       
       function Cherche_Plaque_Adaptee (Liste_Pl : T_Liste; Piece : Pieces.Piece) return T_Liste is
		function Taille_Ok (P : in Plaques.Plaque) return Boolean is
		begin
			return Plaques.Peut_Accueillir(P, Piece);
		end Taille_Ok;
				
		function Cherche_Plaque is new Cherche(Taille_Ok);
        begin
            return Cherche_Plaque (Liste_Pl);
       end Cherche_Plaque_Adaptee;
    
    procedure Vider (Liste_Pl : out T_Liste) is
    begin
        Liste.Vider(Liste_Pl);
    end Vider;
    
	procedure Trier (Liste_Pl : in out T_Liste) is
		procedure Trier_Tout is new Tri(Plaques.Comparer);
	begin
		Trier_Tout(Liste_Pl);
	end Trier;

    procedure Redim_Morceau_Vide_Colonne(
        Liste_Pl : in out T_Liste; 
        Id_Plaque : in Natural;
        Colonne : in Natural;
        Largeur : in Natural;
        Hauteur : in Natural;
        Decalage_Gauche : in Natural
        ) is
        
        procedure Traiter_Morceau_Vide (P : in out Plaques.Plaque) is
            Pos_Morceau : Dimension;
            Dim_Morceau : Dimension;
        begin
            if (Plaques.Get_Id(P) = Id_Plaque) then
                if (Get_Largeur(Plaques.Get_Position(P)) = Colonne) then
                
                    Plaques.Set_Taille(
                        P,
                        Dim(Largeur, Get_Hauteur(Plaques.Get_Taille(P)) + Hauteur)
                        );
                    
                    Pos_Morceau := Plaques.Get_Position(P);
                    Set_Hauteur(Pos_Morceau, Get_Hauteur(Pos_Morceau) - Hauteur);
                    Plaques.Set_Position(P, Pos_Morceau);
                end if;
                
                if (Get_Largeur(Plaques.Get_Position(P)) > Colonne) then
                    Pos_Morceau := Plaques.Get_Position(P);
                    Set_Largeur(Pos_Morceau, Get_Largeur(Pos_Morceau) - Decalage_Gauche);
                    Plaques.Set_Position(P, Pos_Morceau);
                    
                    if Get_Hauteur(Pos_Morceau) = 0 then
                        Dim_Morceau := Plaques.Get_Taille(P);
                        Set_Largeur(Dim_Morceau, Get_Largeur(Dim_Morceau) + Decalage_Gauche);
                        Plaques.Set_Taille(P, Dim_Morceau);
                    end if;
                end if;
                
            end if;

        end Traiter_Morceau_Vide;
        
        procedure Chercher is new Liste.Map(Traiter_Morceau_Vide);
    begin
        Chercher(Liste_Pl);
    end Redim_Morceau_Vide_Colonne;

	procedure Afficher (Liste_Pl : in T_Liste) is
		procedure Afficher_Plaque (P : in Plaques.Plaque) is
		begin
			Ada.Text_Io.Put_Line(Plaques.ToString(P));
		end Afficher_Plaque;
		
		procedure Afficher_Tout is new Liste.Foreach(Afficher_Plaque);
	begin
		Afficher_Tout(Liste_Pl);
		Ada.Text_Io.new_line;
	end Afficher;
		
end Liste_Plaques;